package cn.han.tickets;

//设计多线程编程模型，4个窗口共计售票100张
//本方案使用多线程编程方案1.继承Thread类的方式来完成
public class TestThreadV1 {
    public static void main(String[] args) {
        Ticketv1 t1 = new Ticketv1();
        Ticketv1 t2 = new Ticketv1();
        Ticketv1 t3 = new Ticketv1();
        Ticketv1 t4 = new Ticketv1();

        t4.start();
        t1.start();
        t2.start();
        t3.start();
    }
}

/*1.多线程中出现数据安全问题的原因：多线程程序+有共享数据+多条语句操作共享数据
 * 2.同步锁：相当于给容易出现问题的代码加了一把锁，枷锁以后，这些代码实现同步效果
 * 同步就是排队，需要考虑吧两个问题：
 * 1）枷锁的范围：不能太大，太大，效率太低，太小，锁不住
 * 2）多个线程对象必须是同一把锁，锁对象只有一个，不然锁不住*/
class Ticketv1 extends Thread {
    static int tickets = 100;
    //创建锁对象，锁对象的类型不限制，但是得唯一
//    Object o = new Object();

    @Override
    public void run() {
//        super.run();
        while (true) {
            //当前类的字节码对象，这个肯定唯一
            synchronized (Ticketv1.class) {//解决的是重卖
                if (tickets > 0) {//解决超卖
                    try {
                        //问题1：产生了重卖的现象
                        //问题2：产生了超卖的现象

                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(getName() + "=" + tickets--);
                    if (tickets <= 0) break;
                }
            }
        }
    }
}